package gui.storageunit;

import gui.common.Controller;
import gui.common.IView;
import gui.inventory.ProductContainerData;
import model.entity.container.ProductContainer;
import model.entity.container.StorageUnit;
import model.management.StorageUnitManager;

import common.Result;

/**
 * Controller class for the add storage unit view.
 * 
 * @author Ian Ryu
 * 
 */
public class AddStorageUnitController extends Controller implements IAddStorageUnitController
{

  /**
   * Constructor.
   * 
   * @param view
   *          Reference to add storage unit view
   */
  public AddStorageUnitController(IView view)
  {
    super(view);

    construct();
    getView().enableOK(false);
    getView().enableStorageUnitName(true);
  }

  //
  // Controller overrides
  //

  /**
   * Returns a reference to the view for this controller.
   * 
   * {@pre None}
   * 
   * {@post Returns a reference to the view for this controller.}
   */
  @Override
  protected IAddStorageUnitView getView()
  {
    return (IAddStorageUnitView) super.getView();
  }

  /**
   * Sets the enable/disable state of all components in the controller's view. A component should
   * be enabled only if the user is currently allowed to interact with that component.
   * 
   * {@pre None}
   * 
   * {@post The enable/disable state of all components in the controller's view have been set
   * appropriately.}
   */
  @Override
  protected void enableComponents()
  {
    boolean enable = true;
    try
    {
      String name = getView().getStorageUnitName();
      StorageUnit unit = new StorageUnit(name);
      Result result = StorageUnitManager.validateAdd(unit);
      enable &= result.getStatus();
    }
    catch (Exception e)
    {
      enable = false;
    }

    getView().enableOK(enable);
  }

  /**
   * Loads data into the controller's view.
   * 
   * {@pre None}
   * 
   * {@post The controller has loaded data into its view}
   */
  @Override
  protected void loadValues()
  {
    // probably nothing for this method
  }

  //
  // IAddStorageUnitController overrides
  //

  /**
   * This method is called when any of the fields in the add storage unit view is changed by the
   * user.
   */
  @Override
  public void valuesChanged()
  {
    enableComponents();
  }

  /**
   * This method is called when the user clicks the "OK" button in the add storage unit view.
   */
  @Override
  public void addStorageUnit()
  {
    try
    {
      String storageUnitName = getView().getStorageUnitName();
      ProductContainer tempSU = new StorageUnit(storageUnitName);

      ProductContainerData tempPCD = new ProductContainerData();
      tempPCD.setName(storageUnitName);
      tempPCD.setTag(tempSU);

      StorageUnitManager.add(new StorageUnit(storageUnitName));
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}
